package luke.core.utils;

import com.formdev.flatlaf.extras.FlatSVGIcon;

import javax.swing.*;
import java.awt.*;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;

/**
 * SVG图标加载工具类
 * 用于加载和缓存SVG图标，提高性能
 */
public class SvgIconLoader {
    // 图标缓存，避免重复加载
    private static final Map<String, FlatSVGIcon> iconCache = new HashMap<>();

    /**
     * 加载SVG图标
     *
     * @param path SVG文件路径（相对于classpath）
     * @param width 图标宽度
     * @param height 图标高度
     * @return FlatSVGIcon对象
     */
    public static FlatSVGIcon loadSvgIcon(String path, int width, int height) {
        // 创建缓存键
        String cacheKey = path + "_" + width + "x" + height;
        
        // 检查缓存中是否已存在
        FlatSVGIcon icon = iconCache.get(cacheKey);
        if (icon != null) {
            return icon;
        }
        
        try {
            // 确保路径格式正确
            String resourcePath = path;
            if (path.startsWith("/")) {
                resourcePath = path.substring(1);
            }
            
            // 尝试加载SVG图标
            ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
            URL resource = classLoader.getResource(resourcePath);
            
            if (resource != null) {
                icon = new FlatSVGIcon(resourcePath, width, height);
                iconCache.put(cacheKey, icon);
                return icon;
            } else {
                System.err.println("无法找到SVG图标资源: " + path + " (尝试路径: " + resourcePath + ")");
                return null;
            }
        } catch (Exception e) {
            System.err.println("加载SVG图标失败: " + path + ", 错误: " + e.getMessage());
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 加载SVG图标（使用默认大小16x16）
     *
     * @param path SVG文件路径（相对于classpath）
     * @return FlatSVGIcon对象
     */
    public static FlatSVGIcon loadSvgIcon(String path) {
        return loadSvgIcon(path, 16, 16);
    }

    /**
     * 为按钮设置SVG图标并调整按钮大小
     *
     * @param button 按钮
     * @param iconPath SVG图标路径
     * @param width 图标宽度
     * @param height 图标高度
     */
    public static void setButtonIcon(AbstractButton button, String iconPath, int width, int height) {
        FlatSVGIcon icon = loadSvgIcon(iconPath, width, height);
        if (icon != null) {
            button.setIcon(icon);
            // 根据图标大小调整按钮的首选大小
            Dimension preferredSize = button.getPreferredSize();
            // 增加一些边距，确保图标完全显示
            int margin = 8;
            preferredSize.width = Math.max(preferredSize.width, width + margin);
            preferredSize.height = Math.max(preferredSize.height, height + margin);
            button.setPreferredSize(preferredSize);
            button.setMinimumSize(preferredSize);
        }
    }

    /**
     * 为按钮设置SVG图标（使用默认大小16x16）并调整按钮大小
     *
     * @param button 按钮
     * @param iconPath SVG图标路径
     */
    public static void setButtonIcon(AbstractButton button, String iconPath) {
        setButtonIcon(button, iconPath, 16, 16);
    }
    
    /**
     * 为标签设置SVG图标并调整标签大小
     *
     * @param label 标签
     * @param iconPath SVG图标路径
     * @param width 图标宽度
     * @param height 图标高度
     */
    public static void setButtonIcon(JLabel label, String iconPath, int width, int height) {
        FlatSVGIcon icon = loadSvgIcon(iconPath, width, height);
        if (icon != null) {
            label.setIcon(icon);
            // 根据图标大小调整标签的首选大小
            Dimension preferredSize = label.getPreferredSize();
            // 增加一些边距，确保图标完全显示
            int margin = 8;
            preferredSize.width = Math.max(preferredSize.width, width + margin);
            preferredSize.height = Math.max(preferredSize.height, height + margin);
            label.setPreferredSize(preferredSize);
            label.setMinimumSize(preferredSize);
        }
    }
    
    /**
     * 为标签设置SVG图标（使用默认大小16x16）并调整标签大小
     *
     * @param label 标签
     * @param iconPath SVG图标路径
     */
    public static void setButtonIcon(JLabel label, String iconPath) {
        setButtonIcon(label, iconPath, 16, 16);
    }
}